﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GeneralServices.Model
{
    /// <summary>
    /// Factory permettant de créer des objets Bean à partir de DTO ou l'inverse.
    /// </summary>
    public abstract class AbstractFactoryDTO
    {
        #region Propriétés
        /// <summary>
        /// Factory étrangères pour construites les objets en relation avec d'autres objets.
        /// </summary>
        public Dictionary<String, AbstractFactoryDTO> ForeignFactory
        {
            get;
            private set;
        }
        #endregion

        #region Constructeur
        /// <summary>
        /// Constructeur vide.
        /// </summary>
        public AbstractFactoryDTO()
        {
            ForeignFactory = new Dictionary<string, AbstractFactoryDTO>();
        }

        /// <summary>
        /// Constructeur avec les factory étrangères.
        /// </summary>
        /// <param name="dico">Dictionnaire de factory étrangères associés par clé.</param>
        public AbstractFactoryDTO(Dictionary<string, AbstractFactoryDTO> dico)
        {
            ForeignFactory = dico;
        }

        #endregion


        #region Méthodes Abstraites

        /// <summary>
        /// 
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public abstract IDTO CreateDTO(object o);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public abstract object CreateBean(IDTO dto);

        #endregion

        /// <summary>
        /// 
        /// </summary>
        /// <param name="os"></param>
        /// <returns></returns>
        public List<IDTO> CreateListDTO(List<object> os)
        {
            List<IDTO> list = new List<IDTO>();
            os.ForEach(delegate(object o) { list.Add(this.CreateDTO(o)); });
            return list;
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="dtos"></param>
        /// <returns></returns>
        public List<object> CreateListBean(List<IDTO> dtos)
        {
            List<object> list = new List<object>();
            dtos.ForEach(delegate(IDTO dto) { list.Add(this.CreateBean(dto)); });
            return list;
        }


    }
}
